使用標準動作已經可以減少使用scripting的方式
但所接受的特性為string或基本的資料型別
當遇到特性為物件時,並沒有辦法完整呈現
在這裡用一個簡單的例子做示範
首先我們有兩個class
分別是Student以及Highschool
Student.java
package com.java.test;
public class Student {
private String Name;
private Highschool Highschool;
public Highschool getHighschool() {
return Highschool;
}
public void setHighschool(Highschool highschool) {
Highschool = highschool;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
Highschool.java
package com.java.test;
public class Highschool {
private String Name;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
這個時候假設我們已經在Highschool設定好name的值
但是透過Student的getHighschool去呼叫
並將它使用request.setSAttribute
//s為s物件
request.setSAttribute("Student",s)
這樣的狀況下在scripting是可以的
<%=((Student)request.getAttribute("student")).getHighschool().getName() %>
但在標準動作下會有問題
//highschool是一個物件的名稱
//並不是字串或基本的資料型別
//這樣只會得到物件的toSrting()
<jsp:getProperty name="student" property="highschool"
因此這時就需要EL來處理
除了可以解決這類型的問題
還可以更精簡及直覺的表示
使網頁開發人員即便不懂java仍不影響開發
且增加可維護的便利性
此case使用EL表示為
${student.highschool.name}
基本結構
EL的表示方法很簡單,主要由$號及括號組成
${ }
.號運算子
.點號在EL的表示規則如下:
1.變數後接點號,左邊的變數衣錠是Map或是bean物件
2.點號右邊一定是Map的key或是bean的特性
3.點號右邊的名稱必須符合java名稱規則(因為會對應到java程式)
[]運算子
[]具有和.號一樣的功能,但可以更彈性,規則如下:
1.變數後面接[],[]左邊可以為Map,bean,List以及Array
2.[]裡是一個字串(可以以雙引號或無雙引號)
裡面的內容可以是Map key,bean的特性,List的index或是Array的index
針對這些可擴充的表示內容,整理如下:
陣列
${myArray} //呼叫物件的toString()
//但在List,會印出其內容
${myArray[0]} //index = 0
${myArray["0"]} //index = 0(在array和List來說,字串的index會被強制轉換成int)
${myArray["my"]} //錯誤,因為沒有index為my這種東西
bean及Map
//兩種結果相同
${myMap.Name}
${myMap["Name"]}
有無雙引號差異
若在呼叫key或特性名稱時,沒有加雙引號,則Container會自動去找
簡單說就是
有加雙引號的 =>必定是key或是特性名稱
沒有雙引號的 =>container會去找其內容相同的屬性名稱下的對應值
巢狀表示
EL提供巢狀結構的形式存在
舉個例子
myMap.put("a", "aaa");
myMap.put("b", "bbb");
myMap.put("c", "ccc");
${myMap[myMap[0]]} //結果為"aaa"
EL也有提供一些隱含物件,如下
pageScope/requestScope/sessionScope/applicationScope
提供使用XXXXScope來取得XXXX作用域的屬性
可搭配pageContext使用來取得物件的特性
${requestScope.Student.name}
//因為屬性名稱為字串,不需要符合java變數命名規則
//因像這樣是合法的宣告request.setAttribute("com.java.Student",s);
${requestScope.com.java.Student.name} //不合法,會錯
${requestScope[com.java.Student].name} //XXXXScope另一個功用
param/paramValues
取得HTML表單的值
//<input type="text" name="name" />
${param.name}
//也可以拿來取多個值
//<input type="text" name="number" />
//<input type="text" name="number" />
${param.number}//預設會取number得第一個內容
${paramValues.number[0]}
${paramValues.number[1]}
header/headerValues
取得標頭內容
${header.host}
${header["host"]}
cookie
取得cookie
//取得user cookie
${cookie.user.value}
initParam
取得context的初始參數(非servlet的初始參數,和init-param完全不相同)
//context的初始參數
//context-param
${initParam.name}
pageCpontext
請求物件的特性
${pageContext.request.UpdateName}
EL也可以表示function,使用function來呼叫要執行的動作
步驟如下:
1.撰寫java class(必須為public 且static的)
public class TestFunction{
public static int counter(){
return 10*2;
}
}
2.撰寫TLD標籤程式庫描述子(一般和DD放在同一層)
<uri>myFunction</uri>
<function>
<name>countAmt</name>
<function-class>
com.java.test.TestFunction
</function-class>
<function-signature>
int counter()
</function-signature>
</function>
//myFunction要和TLD對應
<%@ taglib prefix="first" uri="myFunction" %>
//對應到設定檔TLD的name
//name又會去執行對應的java methhod
//並回傳結果
${first.countAmt()}
盡量不要在JSP裡面進行邏輯的判斷
但若必須要使用它去做簡單的運算或是邏輯處理
可以使用下列運算子:
null的處理機制:
算數運算子
顯示空白
邏輯運算子
null當作為0(div會丟出infinity,mod會丟出exception)
關係運算子
將null的變數處理成false